/*
 * @Description: In User Settings Edit
 * @Author: your name
 * @Date: 2018-12-31 18:19:38
 * @LastEditTime: 2018-12-31 21:08:12
 * @LastEditors: Please set LastEditors
 */
// 单例模式: 保证一个类仅有一个实例，并提供一个访问它的全局访问点

// 用代理实现单例模式
// 使用 CreateDiv 单例类，它的作用是负责在页 面中创建唯一的 div 节点

var CreateDiv = function(html) {
    this.html = html;
    this.init();
};
CreateDiv.prototype.init = function() {
    var div = document.createElement('div');
    div.innerHTML = this.html;
    document.body.appendChild(div);
};
var ProxySingletonCreateDiv = (function() {
    var instance;
    return function(html) {
        if (!instance) {
            instance = new CreateDiv(html);
        }
        return instance;
    }
})();
// var a = new ProxySingletonCreateDiv('sven1');
// var b = new ProxySingletonCreateDiv('sven2');
// alert(a === b); //true

// 惰性单例
// 指的是在需要的时候才创建对象实例。惰性单例是单例模式的重点

// 创建唯一的浮窗
var getSingle = function(fn) {
    var result;
    return function() {
        return result || (result = fn.apply(this, arguments));
    }
};
var createLoginLayer = function() {

    var div = document.createElement('div');
    div.innerHTML = '我是登录浮窗';
    div.style.display = 'none';
    document.body.appendChild(div);

    return div;
};
var createSingleLoginLayer = getSingle(createLoginLayer);
document.getElementById('loginBtn').onclick = function() {
    var loginLayer = createSingleLoginLayer();
    loginLayer.style.display = 'block';
};